#include "common.cpp"
#include <iostream>
#include <Cgicc.h>
#include <cgicc/HTTPRedirectHeader.h>
#include "cgicc/HTTPHTMLHeader.h"

using namespace std;
using namespace cgicc;



//ritorna il valore corrispondente alla chiave dai parametri http GET
string get( string key )
{
	Cgicc cgi;
	form_iterator t= cgi.getElement( key );

	if( t != (*cgi).end() && !t->isEmpty() )
		return **t ;
	else
		return string("");	
}



void updateAndSave( Simulator* simulatore ,string url )
{
	simulatore->update();
	simulatore->saveConfig("config.xml");
	cout << *(new HTTPRedirectHeader( url ) ) ;
}






int main()
{

int 
	from= 0
	,to= 0
	,bandwidth
	,latency
;


string 
	cmd= string("")
	,url= string("http://localhost/gfx/") 
	,nome
	,policy
	,type
;


	int n = 8;  // n sono il numero degli AS
	n++;        // incremento n di uno per non usare l'indice zero di vettori e matrici
	
	Simulator simulatore(n);

	simulatore.physicalConfig(); // Istanzio la rete fisica inserita nel file di configurazione           
	simulatore.calculateLogicalNet();
	simulatore.trafficConfig(); // Istanzio il traffico inserito nel file di configurazione

	cmd  = get( "cmd"   ) ; 


if( cmd == "" )
{
	cout << "Content-Type: text/plain\n\n" ;
	simulatore.printXml();
}



//RETE==============
//rete "aggiungi AS"
if( cmd == "aggiungi AS" )
{
	nome  = get( "nome"   ) ; 

	simulatore.addAS( 9, nome, "pippoOwner",true  );

	updateAndSave( &simulatore ,url );
}



if( cmd == "aggiungi LINK" )
{

	from= atoi( get( "link_from" ).c_str() ); 
	to  = atoi( get( "link_to"   ).c_str() ); 
	policy  = get( "policy" ) ; 
	
	bandwidth= atoi( get( "bandwidth" ).c_str() ); 
	latency=   atoi( get( "latency" ).c_str() ); 

	if( from <=0 )
	{
		cout<< "\nerror on from:" <<from;
		return 0;
	}
	
	if( to <=0 ) 
	{
		cout<< "\nerror on to:" <<to;
		return 0;		
	}



	simulatore.addLink( from ,to, policy, bandwidth, latency,true )  ;

	updateAndSave( &simulatore ,url );
}





if( cmd == "elimina AS" )
{
	from= atoi( get( "linkdelete_from" ).c_str() ); 
	to= atoi( get( "linkdelete_to" ).c_str() ); 

	simulatore.deleteAs( from );

	updateAndSave( &simulatore ,url );
}







if( cmd == "elimina Link" )
{
	from= atoi( get( "delete_as" ).c_str() ); 

	simulatore.deleteAs( from );

	updateAndSave( &simulatore ,url );
}






//TRAFFICO -----------------------


if( cmd == "aggiungi Traffico" )
{

	from= atoi( get( "traffic_from" ).c_str() ); 
	to  = atoi( get( "traffic_to"   ).c_str() ); 
	type  = get( "traffic_type" ); 
	
	int amount= atoi( get( "amount"   ).c_str() ); 
	
	
	if( from <=0 )
	{
		cout<< "\nerror on from:" <<from;
		return 0;
	}
	
	if( to <=0 ) 
	{
		cout<< "\nerror on to:" <<to;
		return 0;		
	}

	simulatore.addTraffic(from,to, type, amount );


	updateAndSave( &simulatore ,url );
}




if( cmd == "elimina Traffico" )
{

	from= atoi( get( "traffic_from_delete" ).c_str() ); 
	to  = atoi( get( "traffic_to_delete"   ).c_str() ); 

	if( from <=0 )
	{
		cout<< "\nerror on from:" <<from;
		return 0;
	}
	
	if( to <=0 ) 
	{
		cout<< "\nerror on to:" <<to;
		return 0;		
	}

	simulatore.deleteTraffic( from ,to );


	updateAndSave( &simulatore ,url );
}



//ATTACCHI FISICI =======
if( cmd == "attaccaAS" )
{	
	to  = atoi( get( "attack_to"   ).c_str() ); 

	simulatore.killAS( to );

	updateAndSave( &simulatore ,url );
}





if( cmd == "attaccaLink" )
{	
	from  = atoi( get( "cut_from"   ).c_str() ); 
	to  = atoi( get( "cut_to"   ).c_str() ); 

	simulatore.linkPhysicalAttack( from,to );

	updateAndSave( &simulatore ,url );
}

return 0;
}
